{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<img src=\"http://hilpisch.com/tpq_logo.png\" alt=\"The Python Quants\" width=\"35%\" align=\"right\" border=\"0\"><br>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Python for Finance"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Analyze Big Financial Data**\n",
    "\n",
    "O'Reilly (2014)\n",
    "\n",
    "Yves Hilpisch"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<img style=\"border:0px solid grey;\" src=\"http://hilpisch.com/python_for_finance.png\" alt=\"Python for Finance\" width=\"30%\" align=\"left\" border=\"0\">"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Buy the book ** |\n",
    "<a href='http://shop.oreilly.com/product/0636920032441.do' target='_blank'>O'Reilly</a> |\n",
    "<a href='http://www.amazon.com/Yves-Hilpisch/e/B00JCYHHJM' target='_blank'>Amazon</a>\n",
    "\n",
    "**All book codes & IPYNBs** |\n",
    "<a href=\"http://oreilly.quant-platform.com\">http://oreilly.quant-platform.com</a>\n",
    "\n",
    "**The Python Quants GmbH** | <a href='http://pythonquants.com' target='_blank'>www.pythonquants.com</a>\n",
    "\n",
    "**Contact us** | <a href='mailto:analytics@pythonquants.com'>analytics@pythonquants.com</a>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Finance and Python Syntax"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": false,
    "uuid": "1447b7bb-ed26-4c0f-9e0f-222dfd5d0c9b"
   },
   "outputs": [],
   "source": [
    "S0 = 100.\n",
    "K = 105.\n",
    "T = 1.0\n",
    "r = 0.05\n",
    "sigma = 0.2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": false,
    "uuid": "a95c7301-39f7-4d51-937a-334f051c2d9e"
   },
   "outputs": [],
   "source": [
    "from numpy import *\n",
    "\n",
    "I = 100000\n",
    "\n",
    "random.seed(1000)\n",
    "z = random.standard_normal(I)\n",
    "ST = S0 * exp(r * T + sigma * sqrt(T) * z)\n",
    "hT = maximum(ST - K, 0)\n",
    "C0 = exp(-r * T) * sum(hT) / I"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "collapsed": false,
    "uuid": "84aab05d-40de-4ef1-b3a8-eb08f86e1662"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Value of the European Call Option 9.149\n"
     ]
    }
   ],
   "source": [
    "print \"Value of the European Call Option %5.3f\" % C0"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Time-to-Results"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "collapsed": false,
    "uuid": "e16924db-8402-4bcb-a9c7-d5753346c72a"
   },
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import pandas as pd\n",
    "import pandas.io.data as web"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "collapsed": false,
    "uuid": "22071d72-094b-4b51-aa39-cfa793d58623"
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Open</th>\n",
       "      <th>High</th>\n",
       "      <th>Low</th>\n",
       "      <th>Close</th>\n",
       "      <th>Volume</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Date</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2014-04-08</th>\n",
       "      <td>542.60</td>\n",
       "      <td>555.00</td>\n",
       "      <td>541.61</td>\n",
       "      <td>554.90</td>\n",
       "      <td>3152406</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2014-04-09</th>\n",
       "      <td>559.62</td>\n",
       "      <td>565.37</td>\n",
       "      <td>552.95</td>\n",
       "      <td>564.14</td>\n",
       "      <td>3324742</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2014-04-10</th>\n",
       "      <td>565.00</td>\n",
       "      <td>565.00</td>\n",
       "      <td>539.90</td>\n",
       "      <td>540.95</td>\n",
       "      <td>4027743</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2014-04-11</th>\n",
       "      <td>532.55</td>\n",
       "      <td>540.00</td>\n",
       "      <td>526.53</td>\n",
       "      <td>530.60</td>\n",
       "      <td>3916171</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2014-04-14</th>\n",
       "      <td>538.25</td>\n",
       "      <td>544.10</td>\n",
       "      <td>529.56</td>\n",
       "      <td>532.52</td>\n",
       "      <td>2568020</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "              Open    High     Low   Close   Volume\n",
       "Date                                               \n",
       "2014-04-08  542.60  555.00  541.61  554.90  3152406\n",
       "2014-04-09  559.62  565.37  552.95  564.14  3324742\n",
       "2014-04-10  565.00  565.00  539.90  540.95  4027743\n",
       "2014-04-11  532.55  540.00  526.53  530.60  3916171\n",
       "2014-04-14  538.25  544.10  529.56  532.52  2568020"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "goog = web.DataReader('GOOG', data_source='google',\n",
    "                      start='3/14/2009', end='4/14/2014')\n",
    "goog.index.name = u'Date'\n",
    "goog.tail()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "collapsed": false,
    "uuid": "304b2f50-5b81-4e88-8fa7-ea69995cf2fe"
   },
   "outputs": [],
   "source": [
    "goog['Log_Ret'] = np.log(goog['Close'] / goog['Close'].shift(1))\n",
    "goog['Volatility'] = pd.rolling_std(goog['Log_Ret'], window=252) * np.sqrt(252)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "collapsed": false,
    "uuid": "b4e61939-c7fe-4a1e-a8c9-6fd755edcf86"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([<matplotlib.axes._subplots.AxesSubplot object at 0x7f409dadfa10>,\n",
       "       <matplotlib.axes._subplots.AxesSubplot object at 0x7f409d784dd0>], dtype=object)"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\nAElFTkSuQmCC\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f409dadf410>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "%matplotlib inline\n",
    "goog[['Close', 'Volatility']].plot(subplots=True, color='blue',\n",
    "                                   figsize=(8, 6), grid=True);\n",
    "# tag: goog_vola\n",
    "# title: Google closing prices and yearly volatility"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Paradigm"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "collapsed": false,
    "uuid": "beca497d-4c20-4240-b003-4c79c26154be"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1 loops, best of 3: 9.14 s per loop\n"
     ]
    }
   ],
   "source": [
    "loops = 25000000\n",
    "from math import *\n",
    "a = range(1, loops)\n",
    "def f(x):\n",
    "    return 3 * log(x) + cos(x) ** 2\n",
    "%timeit r = [f(x) for x in a]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "collapsed": false,
    "uuid": "931fd1fc-cc54-4045-802f-acb8f094a23f"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1 loops, best of 3: 1.54 s per loop\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "a = np.arange(1, loops)\n",
    "%timeit r = 3 * np.log(a) + np.cos(a) ** 2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "collapsed": false,
    "uuid": "8d1602b3-a490-4d1a-97d9-112825d86185"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1 loops, best of 3: 1.43 s per loop\n"
     ]
    }
   ],
   "source": [
    "import numexpr as ne\n",
    "ne.set_num_threads(1)\n",
    "f = '3 * log(a) + cos(a) ** 2'\n",
    "%timeit r = ne.evaluate(f)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "collapsed": false,
    "uuid": "6994f16a-1802-4abe-851d-a48e0ead154d"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1 loops, best of 3: 399 ms per loop\n"
     ]
    }
   ],
   "source": [
    "ne.set_num_threads(4)\n",
    "%timeit r = ne.evaluate(f)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<img src=\"http://hilpisch.com/tpq_logo.png\" alt=\"The Python Quants\" width=\"35%\" align=\"right\" border=\"0\"><br>\n",
    "\n",
    "<a href=\"http://www.pythonquants.com\" target=\"_blank\">www.pythonquants.com</a> | <a href=\"http://twitter.com/dyjh\" target=\"_blank\">@dyjh</a>\n",
    "\n",
    "<a href=\"mailto:analytics@pythonquants.com\">analytics@pythonquants.com</a>\n",
    "\n",
    "**Python Quant Platform** |\n",
    "<a href=\"http://oreilly.quant-platform.com\">http://oreilly.quant-platform.com</a>\n",
    "\n",
    "**Derivatives Analytics with Python** |\n",
    "<a href=\"http://www.derivatives-analytics-with-python.com\" target=\"_blank\">Derivatives Analytics @ Wiley Finance</a>\n",
    "\n",
    "**Python for Finance** |\n",
    "<a href=\"http://shop.oreilly.com/product/0636920032441.do\" target=\"_blank\">Python for Finance @ O'Reilly</a>"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 2",
   "language": "python2",
   "name": "python2"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.10"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 0
}
